Clear workspace

rm(list = ls())
library(bigrquery)
library(stringr)
library(tidyverse)
library(dplyr)
library(lme4)
library(MuMIn)
library(scales)
response <- try(system('~/google-cloud-sdk/bin/gcloud projects list --quiet', intern = T))
ERROR: (gcloud.projects.list) There was a problem refreshing your current auth tokens: ('invalid_grant: Bad Request', '{\n  "error": "invalid_grant",\n  "error_description": "Bad Request"\n}')
Please run:

  $ gcloud auth login

to obtain new credentials.

If you have already logged in with a different account:

    $ gcloud config set account ACCOUNT

to select an already authenticated account to use.
Warning: running command '~/google-cloud-sdk/bin/gcloud projects list --quiet' had status 1
projectid <- strsplit(response[3], " ")[[1]][1]
create_dataset <- function(poolname) {
  sql <- str_replace_all("SELECT 
    ##POOL_NAME##.percentage_of_regional_pool_present,
    ##POOL_NAME##.difference_from_locality_trait_gravity,
    ##POOL_NAME##.percentage_of_niches_present,
    ##POOL_NAME##.percentage_of_niches_2_present,
    ##POOL_NAME##.percentage_of_niches_3_present,
    latitude,
    longitude,
    percentage_landcover_5km.closed_forest_total AS closed_forest,
    percentage_landcover_5km.cultivated,
    percentage_landcover_5km.herbaceous_vegetation,
    percentage_landcover_5km.herbaceous_wetland,
    percentage_landcover_5km.open_forest_total AS open_forest,
    percentage_landcover_5km.permanent_water,
    percentage_landcover_5km.shrubs,
    percentage_landcover_5km.urban,
    percentage_landcover_5km.elevation.mean AS mean_elevation,
    percentage_landcover_5km.elevation.delta AS elevation_delta,
    average_population_density.within_5km AS average_population_density,
    urban_area.name AS city_name,
    urban_area.location.continent,
    urban_area.ecosystem.realm,
    urban_area.ecosystem.biome.biome_name AS biome,
    urban_area.country_economy.gdp_estimate_thousand_dollars_per_person AS national_gdp_estimate_thousand_dollars_per_person,
    urban_area.country_economy.income_group AS national_income_group,
    locality_id,
    number_of_checklists
FROM model.urban_hotspot
JOIN model2.all_species USING(locality_id, city_id)
JOIN model.urban_area USING (city_id)", '##POOL_NAME##', poolname)

  print(sql)
  
  tb <- bq_project_query(projectid, sql)

  bq_table_download(tb)
}
load_dataset <- function(poolname) {
  filename <- str_replace('download_data__output__hotspot_metrics_##POOL_NAME##.csv', '##POOL_NAME##', poolname)
  
  if (!file.exists(filename)) {
    data <- create_dataset(poolname)
    write_csv(data, filename)
  }
  
  data <- read_csv(filename)
  
  data$city_name = as.factor(data$city_name)
  data$continent = relevel(as.factor(data$continent), ref = "Europe")
  data$realm = relevel(as.factor(data$realm), ref = "Palearctic")
  data$biome = as.factor(data$biome)
  data$national_income_group = as.factor(data$national_income_group)
  data$mean_elevation_scaled = rescale(data$mean_elevation, to = c(0, 1), from = range(data$mean_elevation, na.rm = TRUE, finite = TRUE))
  data$elevation_delta_scaled = rescale(data$elevation_delta, to = c(0, 1), from = range(data$elevation_delta, na.rm = TRUE, finite = TRUE))
  data$average_population_density_scaled = rescale(data$average_population_density, to = c(0, 1), from = range(data$average_population_density, na.rm = TRUE, finite = TRUE))
  data$national_gdp_estimate_thousand_dollars_per_person_scaled = rescale(data$national_gdp_estimate_thousand_dollars_per_person, to = c(0, 1), from = range(data$national_gdp_estimate_thousand_dollars_per_person, na.rm = TRUE, finite = TRUE))
  data$latitude_scaled = rescale(data$latitude, to = c(0, 1), from = range(data$latitude, na.rm = TRUE, finite = TRUE))
  data$longitude_scaled = rescale(data$longitude, to = c(0, 1), from = range(data$longitude, na.rm = TRUE, finite = TRUE))
  data$absolute_latitude_scaled = abs(data$latitude_scaled)
  data
}

Merlin

merlin <- load_dataset('merlin')
Rows: 8443 Columns: 26── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (6): city_name, continent, realm, biome, national_income_group, locality_id
dbl (20): percentage_of_regional_pool_present, difference_from_locality_trait_gravity, percentage_of_niches_pre...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
merlin

Birdlife

birdlife <- load_dataset('birdlife')
Rows: 8443 Columns: 26── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (6): city_name, continent, realm, biome, national_income_group, locality_id
dbl (20): percentage_of_regional_pool_present, difference_from_locality_trait_gravity, percentage_of_niches_pre...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
birdlife
library("PerformanceAnalytics")
Loading required package: xts
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric


Attaching package: ‘xts’

The following objects are masked from ‘package:dplyr’:

    first, last


Attaching package: ‘PerformanceAnalytics’

The following object is masked from ‘package:graphics’:

    legend
rcorr(as.matrix(birdlife[,c('closed_forest', 'cultivated', 'herbaceous_vegetation', 'herbaceous_wetland', 'open_forest', 'permanent_water', 'shrubs', 'urban')],  method="spearman"))
Error in rcorr(as.matrix(birdlife[, c("closed_forest", "cultivated", "herbaceous_vegetation",  : 
  could not find function "rcorr"

Both

both <- load_dataset('both')
Rows: 8443 Columns: 26── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (6): city_name, continent, realm, biome, national_income_group, locality_id
dbl (20): percentage_of_regional_pool_present, difference_from_locality_trait_gravity, percentage_of_niches_pre...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
both

Either

either <- load_dataset('either')
Rows: 8443 Columns: 26── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (6): city_name, continent, realm, biome, national_income_group, locality_id
dbl (20): percentage_of_regional_pool_present, difference_from_locality_trait_gravity, percentage_of_niches_pre...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
either
city_data <- read_csv('download_data__input__city_data.csv')
Rows: 137 Columns: 89── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (3): name, biome_name, realm
dbl (82): population, total_area, city_gdp_per_population, percentage_urban_area_as_open_public_spaces, percent...
lgl  (4): city_includes_estuary, region_100km_includes_estuary, region_50km_includes_estuary, region_20km_inclu...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
city_data$realm <- as.factor(city_data$realm)
city_data$city_includes_estuary <- as.factor(city_data$city_includes_estuary)
city_data$region_100km_includes_estuary <- as.factor(city_data$region_100km_includes_estuary)
city_data$region_50km_includes_estuary <- as.factor(city_data$region_50km_includes_estuary)
city_data$region_20km_includes_estuary <- as.factor(city_data$region_20km_includes_estuary)
city_data$biome_name <- as.factor(city_data$biome_name)

city_data$population_growth = 0

for(i in 1:nrow(city_data)) {
    city_data[i,]$population_growth = population_growth(city_data[i,])
}

city_data
LS0tCnRpdGxlOiAiRG93bmxvYWQgbG9jYWxpdHkgZGF0YSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKQ2xlYXIgd29ya3NwYWNlCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKYGBgCgpgYGB7cn0KbGlicmFyeShiaWdycXVlcnkpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkobG1lNCkKbGlicmFyeShNdU1JbikKbGlicmFyeShzY2FsZXMpCmBgYAoKYGBge3J9CnJlc3BvbnNlIDwtIHRyeShzeXN0ZW0oJ34vZ29vZ2xlLWNsb3VkLXNkay9iaW4vZ2Nsb3VkIHByb2plY3RzIGxpc3QgLS1xdWlldCcsIGludGVybiA9IFQpKQpwcm9qZWN0aWQgPC0gc3Ryc3BsaXQocmVzcG9uc2VbM10sICIgIilbWzFdXVsxXQpgYGAKICAKCmBgYHtyfQpjcmVhdGVfZGF0YXNldCA8LSBmdW5jdGlvbihwb29sbmFtZSkgewogIHNxbCA8LSBzdHJfcmVwbGFjZV9hbGwoIlNFTEVDVCAKICAgICMjUE9PTF9OQU1FIyMucGVyY2VudGFnZV9vZl9yZWdpb25hbF9wb29sX3ByZXNlbnQsCiAgICAjI1BPT0xfTkFNRSMjLmRpZmZlcmVuY2VfZnJvbV9sb2NhbGl0eV90cmFpdF9ncmF2aXR5LAogICAgIyNQT09MX05BTUUjIy5wZXJjZW50YWdlX29mX25pY2hlc19wcmVzZW50LAogICAgIyNQT09MX05BTUUjIy5wZXJjZW50YWdlX29mX25pY2hlc18yX3ByZXNlbnQsCiAgICAjI1BPT0xfTkFNRSMjLnBlcmNlbnRhZ2Vfb2ZfbmljaGVzXzNfcHJlc2VudCwKICAgIGxhdGl0dWRlLAogICAgbG9uZ2l0dWRlLAogICAgcGVyY2VudGFnZV9sYW5kY292ZXJfNWttLmNsb3NlZF9mb3Jlc3RfdG90YWwgQVMgY2xvc2VkX2ZvcmVzdCwKICAgIHBlcmNlbnRhZ2VfbGFuZGNvdmVyXzVrbS5jdWx0aXZhdGVkLAogICAgcGVyY2VudGFnZV9sYW5kY292ZXJfNWttLmhlcmJhY2VvdXNfdmVnZXRhdGlvbiwKICAgIHBlcmNlbnRhZ2VfbGFuZGNvdmVyXzVrbS5oZXJiYWNlb3VzX3dldGxhbmQsCiAgICBwZXJjZW50YWdlX2xhbmRjb3Zlcl81a20ub3Blbl9mb3Jlc3RfdG90YWwgQVMgb3Blbl9mb3Jlc3QsCiAgICBwZXJjZW50YWdlX2xhbmRjb3Zlcl81a20ucGVybWFuZW50X3dhdGVyLAogICAgcGVyY2VudGFnZV9sYW5kY292ZXJfNWttLnNocnVicywKICAgIHBlcmNlbnRhZ2VfbGFuZGNvdmVyXzVrbS51cmJhbiwKICAgIHBlcmNlbnRhZ2VfbGFuZGNvdmVyXzVrbS5lbGV2YXRpb24ubWVhbiBBUyBtZWFuX2VsZXZhdGlvbiwKICAgIHBlcmNlbnRhZ2VfbGFuZGNvdmVyXzVrbS5lbGV2YXRpb24uZGVsdGEgQVMgZWxldmF0aW9uX2RlbHRhLAogICAgYXZlcmFnZV9wb3B1bGF0aW9uX2RlbnNpdHkud2l0aGluXzVrbSBBUyBhdmVyYWdlX3BvcHVsYXRpb25fZGVuc2l0eSwKICAgIHVyYmFuX2FyZWEubmFtZSBBUyBjaXR5X25hbWUsCiAgICB1cmJhbl9hcmVhLmxvY2F0aW9uLmNvbnRpbmVudCwKICAgIHVyYmFuX2FyZWEuZWNvc3lzdGVtLnJlYWxtLAogICAgdXJiYW5fYXJlYS5lY29zeXN0ZW0uYmlvbWUuYmlvbWVfbmFtZSBBUyBiaW9tZSwKICAgIHVyYmFuX2FyZWEuY291bnRyeV9lY29ub215LmdkcF9lc3RpbWF0ZV90aG91c2FuZF9kb2xsYXJzX3Blcl9wZXJzb24gQVMgbmF0aW9uYWxfZ2RwX2VzdGltYXRlX3Rob3VzYW5kX2RvbGxhcnNfcGVyX3BlcnNvbiwKICAgIHVyYmFuX2FyZWEuY291bnRyeV9lY29ub215LmluY29tZV9ncm91cCBBUyBuYXRpb25hbF9pbmNvbWVfZ3JvdXAsCiAgICBsb2NhbGl0eV9pZCwKICAgIG51bWJlcl9vZl9jaGVja2xpc3RzCkZST00gbW9kZWwudXJiYW5faG90c3BvdApKT0lOIG1vZGVsMi5hbGxfc3BlY2llcyBVU0lORyhsb2NhbGl0eV9pZCwgY2l0eV9pZCkKSk9JTiBtb2RlbC51cmJhbl9hcmVhIFVTSU5HIChjaXR5X2lkKSIsICcjI1BPT0xfTkFNRSMjJywgcG9vbG5hbWUpCgogIHByaW50KHNxbCkKICAKICB0YiA8LSBicV9wcm9qZWN0X3F1ZXJ5KHByb2plY3RpZCwgc3FsKQoKICBicV90YWJsZV9kb3dubG9hZCh0YikKfQpgYGAKCgpgYGB7cn0KbG9hZF9kYXRhc2V0IDwtIGZ1bmN0aW9uKHBvb2xuYW1lKSB7CiAgZmlsZW5hbWUgPC0gc3RyX3JlcGxhY2UoJ2Rvd25sb2FkX2RhdGFfX291dHB1dF9faG90c3BvdF9tZXRyaWNzXyMjUE9PTF9OQU1FIyMuY3N2JywgJyMjUE9PTF9OQU1FIyMnLCBwb29sbmFtZSkKICAKICBpZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgewogICAgZGF0YSA8LSBjcmVhdGVfZGF0YXNldChwb29sbmFtZSkKICAgIHdyaXRlX2NzdihkYXRhLCBmaWxlbmFtZSkKICB9CiAgCiAgZGF0YSA8LSByZWFkX2NzdihmaWxlbmFtZSkKICAKICBkYXRhJGNpdHlfbmFtZSA9IGFzLmZhY3RvcihkYXRhJGNpdHlfbmFtZSkKICBkYXRhJGNvbnRpbmVudCA9IHJlbGV2ZWwoYXMuZmFjdG9yKGRhdGEkY29udGluZW50KSwgcmVmID0gIkV1cm9wZSIpCiAgZGF0YSRyZWFsbSA9IHJlbGV2ZWwoYXMuZmFjdG9yKGRhdGEkcmVhbG0pLCByZWYgPSAiUGFsZWFyY3RpYyIpCiAgZGF0YSRiaW9tZSA9IGFzLmZhY3RvcihkYXRhJGJpb21lKQogIGRhdGEkbmF0aW9uYWxfaW5jb21lX2dyb3VwID0gYXMuZmFjdG9yKGRhdGEkbmF0aW9uYWxfaW5jb21lX2dyb3VwKQogIGRhdGEkbWVhbl9lbGV2YXRpb25fc2NhbGVkID0gcmVzY2FsZShkYXRhJG1lYW5fZWxldmF0aW9uLCB0byA9IGMoMCwgMSksIGZyb20gPSByYW5nZShkYXRhJG1lYW5fZWxldmF0aW9uLCBuYS5ybSA9IFRSVUUsIGZpbml0ZSA9IFRSVUUpKQogIGRhdGEkZWxldmF0aW9uX2RlbHRhX3NjYWxlZCA9IHJlc2NhbGUoZGF0YSRlbGV2YXRpb25fZGVsdGEsIHRvID0gYygwLCAxKSwgZnJvbSA9IHJhbmdlKGRhdGEkZWxldmF0aW9uX2RlbHRhLCBuYS5ybSA9IFRSVUUsIGZpbml0ZSA9IFRSVUUpKQogIGRhdGEkYXZlcmFnZV9wb3B1bGF0aW9uX2RlbnNpdHlfc2NhbGVkID0gcmVzY2FsZShkYXRhJGF2ZXJhZ2VfcG9wdWxhdGlvbl9kZW5zaXR5LCB0byA9IGMoMCwgMSksIGZyb20gPSByYW5nZShkYXRhJGF2ZXJhZ2VfcG9wdWxhdGlvbl9kZW5zaXR5LCBuYS5ybSA9IFRSVUUsIGZpbml0ZSA9IFRSVUUpKQogIGRhdGEkbmF0aW9uYWxfZ2RwX2VzdGltYXRlX3Rob3VzYW5kX2RvbGxhcnNfcGVyX3BlcnNvbl9zY2FsZWQgPSByZXNjYWxlKGRhdGEkbmF0aW9uYWxfZ2RwX2VzdGltYXRlX3Rob3VzYW5kX2RvbGxhcnNfcGVyX3BlcnNvbiwgdG8gPSBjKDAsIDEpLCBmcm9tID0gcmFuZ2UoZGF0YSRuYXRpb25hbF9nZHBfZXN0aW1hdGVfdGhvdXNhbmRfZG9sbGFyc19wZXJfcGVyc29uLCBuYS5ybSA9IFRSVUUsIGZpbml0ZSA9IFRSVUUpKQogIGRhdGEkbGF0aXR1ZGVfc2NhbGVkID0gcmVzY2FsZShkYXRhJGxhdGl0dWRlLCB0byA9IGMoMCwgMSksIGZyb20gPSByYW5nZShkYXRhJGxhdGl0dWRlLCBuYS5ybSA9IFRSVUUsIGZpbml0ZSA9IFRSVUUpKQogIGRhdGEkbG9uZ2l0dWRlX3NjYWxlZCA9IHJlc2NhbGUoZGF0YSRsb25naXR1ZGUsIHRvID0gYygwLCAxKSwgZnJvbSA9IHJhbmdlKGRhdGEkbG9uZ2l0dWRlLCBuYS5ybSA9IFRSVUUsIGZpbml0ZSA9IFRSVUUpKQogIGRhdGEkYWJzb2x1dGVfbGF0aXR1ZGVfc2NhbGVkID0gYWJzKGRhdGEkbGF0aXR1ZGVfc2NhbGVkKQogIGRhdGEKfQpgYGAKCgpNZXJsaW4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9Cm1lcmxpbiA8LSBsb2FkX2RhdGFzZXQoJ21lcmxpbicpCm1lcmxpbgpgYGAKCkJpcmRsaWZlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpiaXJkbGlmZSA8LSBsb2FkX2RhdGFzZXQoJ2JpcmRsaWZlJykKYmlyZGxpZmUKYGBgCgpgYGB7cn0KbGlicmFyeSgiUGVyZm9ybWFuY2VBbmFseXRpY3MiKQpyY29ycihhcy5tYXRyaXgoYmlyZGxpZmVbLGMoJ2Nsb3NlZF9mb3Jlc3QnLCAnY3VsdGl2YXRlZCcsICdoZXJiYWNlb3VzX3ZlZ2V0YXRpb24nLCAnaGVyYmFjZW91c193ZXRsYW5kJywgJ29wZW5fZm9yZXN0JywgJ3Blcm1hbmVudF93YXRlcicsICdzaHJ1YnMnLCAndXJiYW4nKV0sICBtZXRob2Q9InNwZWFybWFuIikpCmBgYAoKQm90aAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KYm90aCA8LSBsb2FkX2RhdGFzZXQoJ2JvdGgnKQpib3RoCmBgYAoKRWl0aGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQplaXRoZXIgPC0gbG9hZF9kYXRhc2V0KCdlaXRoZXInKQplaXRoZXIKYGBgCgpgYGB7cn0KcG9wdWxhdGlvbl9ncm93dGggPC0gZnVuY3Rpb24oY2l0eV9yb3cpIHsKICBwb3B1bGF0aW9uIDwtIGMoY2l0eV9yb3ckcG9wMTk1MCwgY2l0eV9yb3ckcG9wMTk1NSwgY2l0eV9yb3ckcG9wMTk2MCwgY2l0eV9yb3ckcG9wMTk2NSwgY2l0eV9yb3ckcG9wMTk3MCwgY2l0eV9yb3ckcG9wMTk3NSwgY2l0eV9yb3ckcG9wMTk4MCwgY2l0eV9yb3ckcG9wMTk4NSwgY2l0eV9yb3ckcG9wMTk5MCwgY2l0eV9yb3ckcG9wMTk5NSwgY2l0eV9yb3ckcG9wMjAwMCwgY2l0eV9yb3ckcG9wMjAwNSwgY2l0eV9yb3ckcG9wMjAxMCwgY2l0eV9yb3ckcG9wMjAxNSwgY2l0eV9yb3ckcG9wMjAyMCkKICB5ZWFycyA8LSBjKDE5NTAsIDE5NTUsIDE5NjAsIDE5NjUsIDE5NzAsIDE5NzUsIDE5ODAsIDE5ODUsIDE5OTAsIDE5OTUsIDIwMDAsIDIwMDUsIDIwMTAsIDIwMTUsIDIwMjApCiAgCiAgbW9kZWwgPC0gbG0ocG9wdWxhdGlvbiB+IHllYXJzKQogIG1vZGVsJGNvZWZmaWNpZW50c1syXQp9CmBgYAoKCmBgYHtyfQpjaXR5X2RhdGEgPC0gcmVhZF9jc3YoJ2Rvd25sb2FkX2RhdGFfX2lucHV0X19jaXR5X2RhdGEuY3N2JykKY2l0eV9kYXRhJHJlYWxtIDwtIGFzLmZhY3RvcihjaXR5X2RhdGEkcmVhbG0pCmNpdHlfZGF0YSRjaXR5X2luY2x1ZGVzX2VzdHVhcnkgPC0gYXMuZmFjdG9yKGNpdHlfZGF0YSRjaXR5X2luY2x1ZGVzX2VzdHVhcnkpCmNpdHlfZGF0YSRyZWdpb25fMTAwa21faW5jbHVkZXNfZXN0dWFyeSA8LSBhcy5mYWN0b3IoY2l0eV9kYXRhJHJlZ2lvbl8xMDBrbV9pbmNsdWRlc19lc3R1YXJ5KQpjaXR5X2RhdGEkcmVnaW9uXzUwa21faW5jbHVkZXNfZXN0dWFyeSA8LSBhcy5mYWN0b3IoY2l0eV9kYXRhJHJlZ2lvbl81MGttX2luY2x1ZGVzX2VzdHVhcnkpCmNpdHlfZGF0YSRyZWdpb25fMjBrbV9pbmNsdWRlc19lc3R1YXJ5IDwtIGFzLmZhY3RvcihjaXR5X2RhdGEkcmVnaW9uXzIwa21faW5jbHVkZXNfZXN0dWFyeSkKY2l0eV9kYXRhJGJpb21lX25hbWUgPC0gYXMuZmFjdG9yKGNpdHlfZGF0YSRiaW9tZV9uYW1lKQoKY2l0eV9kYXRhJHBvcHVsYXRpb25fZ3Jvd3RoID0gMAoKZm9yKGkgaW4gMTpucm93KGNpdHlfZGF0YSkpIHsKICAgIGNpdHlfZGF0YVtpLF0kcG9wdWxhdGlvbl9ncm93dGggPSBwb3B1bGF0aW9uX2dyb3d0aChjaXR5X2RhdGFbaSxdKQp9CgpjaXR5X2RhdGEKYGBgCgoKCg==